//
//  HQL5_7ViewController.h
//  CoreAnimationDemo
//
//  Created by Qilin Hu on 2019/9/19.
//  Copyright © 2019 Tonintech. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

/**
 创建一个立方体，添加光亮和阴影效果
 
 FIXME: 光线效果没出来
 */
@interface HQL5_7ViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

/*
 # 固体对象
 
 现在你懂得了在 3D 空间的一些图层布局的基础，我们来试着创建一个固态的 3D 对象（实际上是一个技术上所谓的空洞对象，但它以固态呈现）。
 我们用六个独立的视图来构建一个立方体的各个面
 
 # 光亮和阴影
 
 如果需要动态地创建光线效果，你可以根据每个视图的方向应用不同的 alpha 值做出半透明的阴影图层，但为了计算阴影图层的不透明度，你需要得到每个面的正太向量（垂直于表面的向量），然后根据一个想象的光源计算出两个向量叉乘结果。叉乘代表了光源和图层之间的角度，从而决定了它有多大程度上的光亮。
 
 我们用 GLKit 框架来做向量的计算（你需要引入 GLKit 库来运行代码），每个面的 CATransform3D 都被转换成 GLKMatrix4，然后通过 GLKMatrix4GetMatrix3 函数得出一个 3×3 的旋转矩阵。
 这个旋转矩阵指定了图层的方向，然后可以用它来得到正太向量的值。

 
 # 点击事件
 
 你应该能注意到现在可以在第三个表面的顶部看见按钮了，点击它，什么都没发生，为什么呢？
 这并不是因为 iOS 在 3D 场景下没有正确地处理响应事件，实际上是可以做到的。问题在于视图顺序。在第三章中我们简要提到过，点击事件的处理由视图在父视图中的顺序决定的，并不是 3D 空间中的 Z 轴顺序。当给立方体添加视图的时候，我们实际上是按照一个顺序添加，所以按照视图 / 图层顺序来说，4，5，6 在 3 的前面。
 即使我们看不见 4，5，6 的表面（因为被 1，2，3 遮住了），iOS 在事件响应上仍然保持之前的顺序。当试图点击表面 3 上的按钮，表面 4，5，6 截断了点击事件（取决于点击的位置），这就和普通的 2D 布局在按钮上覆盖物体一样。
 你也许认为把 doubleSided 设置成 NO 可以解决这个问题，因为它不再渲染视图后面的内容，但实际上并不起作用。因为背对相机而隐藏的视图仍然会响应点击事件（这和通过设置 hidden 属性或者设置 alpha 为 0 而隐藏的视图不同，那两种方式将不会响应事件）。所以即使禁止了双面渲染仍然不能解决这个问题（虽然由于性能问题，还是需要把它设置成 NO）。
 这里有几种正确的方案：把除了表面 3 的其他视图 userInteractionEnabled 属性都设置成 NO 来禁止事件传递。或者简单通过代码把视图 3 覆盖在视图 6 上。无论怎样都可以点击按钮了
 
 */
